package a09_JUC;

import java.util.concurrent.Semaphore;

/**
 * @Author quan
 * @Description 演示信号量的使用
 * @Date 2023/5/18 15:57
 */
public class a05_Semaphore {
    //1、定义一个信号变量，表示可用资源的个数
    private static Semaphore semaphore = new Semaphore(3);
    public static void main(String[] args){
        //2、定义任务：用来申请资源和释放资源
        //创建 20 个线程, 每个线程都尝试申请资源, sleep 1秒之后, 释放资源. 观察程序的执行效果.
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                try {
                    //3、任务是：让每个线程都尝试申请资源
                    System.out.println(Thread.currentThread().getName()+"[.]申请资源");
                    //4、调用acquire，让可用资源数-1
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"[+]申请到了资源");
                    //5、休眠1s，释放资源
                    semaphore.release();
                    System.out.println(Thread.currentThread().getName()+"[-]释放资源");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        //创建多个线程并启动，执行任务
        for (int i = 0; i < 20; i++) {
            Thread thread = new Thread(runnable);
            thread.start();
        }
    }
}
